home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / doom / turric03.zip / TURRIC03.ZIP / PROGS / CORPSE.QC < prev    next >
Text File  |  1997-02-06  |  5KB  |  184 lines

  1. /*
  2. ==============================================================================
  3.  
  4. CORPSES
  5.  
  6. ==============================================================================
  7.  
  8. File was created by Turrican to hold all corpse related functions while
  9. working on additions to Jason Carter's gibbin3 patch.
  10.  
  11. */
  12. // prototypes
  13. void(string gibname, float dm) ThrowGib;
  14. void(string gibname, float dm) ThrowHead;
  15.  
  16.  
  17. // Thanks to Michael Gummelt <gummelt@pegasus.montclair.edu> for helping
  18. // me with this \/.
  19. void () WalkOnCorpse =
  20. {
  21.     if (other == world ||
  22.         other.classname == "grenade" ||
  23.         other.classname == "missile")
  24.     {
  25.         return;
  26.     }
  27.  
  28.     other.flags = other.flags | FL_ONGROUND;
  29.  
  30.     if (self.classname == "gib")
  31.     {
  32.         EatGibs();
  33.     }
  34.     else if (self.classname == "gib_head" ||
  35.              self.classname == "player_head")
  36.     {
  37.         EatHead();
  38.     }
  39. };
  40.  
  41. // Has size and head gib model parameters passed as globals in
  42. // .corpse_size and .head_gib_model, which are set at the start of a monster's
  43. // _die function.
  44. void () Corpse_die =
  45. {
  46.     local float    i;        // loop counter.
  47.  
  48.  
  49.     self.deadflag = DEAD_DEAD;
  50.  
  51.     if ((time >= (self.corpse_time + 0.5)) && (self.corpse_time != 0))
  52.     {
  53.         sound (self, CHAN_VOICE, "player/tornoff2.wav", 1, ATTN_NONE);
  54.         if (damage_attacker.classname == "teledeath" ||
  55.             damage_attacker.classname == "teledeath2")
  56.             return;
  57.     }
  58.     else
  59.     {
  60.         if (damage_attacker.classname == "teledeath")
  61.         {
  62.             sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
  63.             return;
  64.         }
  65.  
  66.         if (damage_attacker.classname == "teledeath2")
  67.         {
  68.             sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
  69.             return;
  70.         }
  71.  
  72.         if (random() < 0.5)
  73.             sound (self, CHAN_VOICE, "player/gib.wav", 1, ATTN_NONE);
  74.         else
  75.             sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NONE);
  76.     }
  77.  
  78.     ThrowHead (self.head_gib_name, self.health);
  79.  
  80.     i = 0;
  81.     while (i <= self.corpse_size)
  82.     {
  83.         ThrowGib ("progs/gib1.mdl", self.health * self.corpse_size);
  84.         ThrowGib ("progs/gib2.mdl", self.health * self.corpse_size);
  85.         ThrowGib ("progs/gib3.mdl", self.health * self.corpse_size);
  86.         ThrowGib ("progs/gib3.mdl", self.health * self.corpse_size);
  87.         i = i + 1;
  88.     }
  89. };
  90.  
  91. void () Head_die =
  92. {
  93. //** PATCH_BEGIN - temporary entity limiting - Turrican ****
  94. // To prevent packet overflows from too many gibs being created.
  95.     if (current_temp_entities < MAX_TEMP_ENTITIES)
  96.     {
  97.         ThrowGib ("progs/gib1.mdl", self.health * 3);
  98.         ThrowGib ("progs/gib1.mdl", self.health * 3);
  99.         ThrowGib ("progs/zom_gib.mdl", self.health * 3);
  100.         ThrowGib ("progs/zom_gib.mdl", self.health * 3);
  101.         ThrowGib ("progs/zom_gib.mdl", self.health * 3);
  102.         ThrowGib ("progs/zom_gib.mdl", self.health * 3);
  103.     }
  104.     SUB_RemoveTempEnt();
  105. //** PATCH_END - temporary entity limiting - Turrican ******
  106. };
  107.  
  108. void () MakeGibSolid =
  109. {
  110.     self.solid = SOLID_SLIDEBOX;
  111.     setsize (self, '-5 -5 0', '5 5 10');
  112.     self.takedamage = DAMAGE_YES;
  113.     self.health = GIB_HEALTH;
  114.     self.classname = "gib";
  115.     self.touch = WalkOnCorpse;
  116.     self.nextthink = time + 10 + random()*10;
  117. //** PATCH_BEGIN - temporary entity limiting - Turrican ****
  118.     self.think = SUB_RemoveTempEnt;
  119.     self.th_die = SUB_RemoveTempEnt;
  120. //** PATCH_END - temporary entity limiting - Turrican ******
  121. };
  122.  
  123. void (float corpse_health, vector size_min, vector size_max) MakeCorpse =
  124. {
  125.     self.health = corpse_health;
  126.     setsize (self, size_min, size_max);
  127.     self.th_stand = SUB_Null;
  128.     self.th_walk = SUB_Null;
  129.     self.th_run = SUB_Null;
  130.     self.th_pain = SUB_Gib;
  131.     self.th_melee = SUB_Null;
  132.     self.th_missile = SUB_Null;
  133.     self.takedamage= DAMAGE_YES; // DAMAGE_AIM ?
  134.     self.flags = self.flags &! FL_MONSTER;
  135.     self.classname = "corpse";
  136.     self.th_die = Corpse_die;
  137.     self.corpse_time = time;
  138.  
  139. // Thanks to Michael Gummelt <gummelt@pegasus.montclair.edu> for helping
  140. // me with this \/.
  141.     self.touch = WalkOnCorpse;
  142. };
  143.  
  144. void (float corpse_health, vector size_min, vector size_max) MakePlayerCorpse =
  145. {
  146.     local    entity     corpse;
  147.  
  148. // Create a corpse
  149.     corpse = spawn();
  150.     corpse.solid = self.solid;
  151.     corpse.movetype = self.movetype;
  152.     corpse.origin = self.origin;
  153.     corpse.angles = self.angles;
  154.     setmodel(corpse, self.model);
  155.     corpse.colormap = self.colormap;
  156.     corpse.skin = self.skin;
  157.     setsize (corpse, size_min, size_max);
  158.     corpse.modelindex = self.modelindex;
  159.     corpse.frame = self.frame;
  160.     corpse.velocity = self.velocity;
  161.     corpse.avelocity = self.avelocity;
  162.  
  163.     corpse.health = corpse_health;
  164.     corpse.th_pain = SUB_Gib;
  165.     corpse.takedamage= DAMAGE_YES; // DAMAGE_AIM ?
  166.     corpse.classname = "corpse";
  167.     corpse.th_die = Corpse_die;
  168.     corpse.head_gib_name = self.head_gib_name;
  169.     corpse.corpse_size = self.corpse_size;
  170.     corpse.corpse_time = time;
  171.  
  172. // Thanks to Michael Gummelt <gummelt@pegasus.montclair.edu> for helping
  173. // me with this \/.
  174.     corpse.touch = WalkOnCorpse;
  175.  
  176. // Alter self.
  177.     setmodel(self, "");
  178.     setsize (self, VEC_ORIGIN, VEC_ORIGIN);
  179.     self.solid = SOLID_NOT;
  180.     self.touch = SUB_Null;
  181.     self.takedamage = DAMAGE_NO;
  182.     self.view_ofs = '40 0 -20';
  183. };
  184.